package com;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;

import java.io.File;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class IOTest {

    private static  Set<String> zipSet = new HashSet<>();
    private  String dir;

    public IOTest(String dir) {
        this.dir = dir;
    }

    static {
        zipSet.add("zip");
    }

    public static void main(String[] args) {
        IOTest ioTest = new IOTest("C:\\Users\\巧啡豆\\Desktop\\test");
        //ioTest.unZip(ioTest.dir, ioTest.dir + "/unzip", "GBK");

        ioTest.dirHandle(ioTest.dir + "/unzip", ioTest.dir + "/unzip");
        ioTest.zip(ioTest.dir + "/unzip", ioTest.dir, "第三层核酸码");
    }

    public void zip(String path,String newPath, String newName){
        //srcPath – 要压缩的源文件路径。如果压缩一个文件，则为该文件的全路径；如果压缩一个目录，则为该目录的顶层目录路径
        //zipPath – 压缩文件保存的路径，包括文件名。注意：zipPath不能是srcPath路径下的子文件夹
        //withSrcDir – 是否包含被打包目录
        final File zip = ZipUtil.zip(path, newPath + "/" + newName + ".zip", false);
        //System.out.println(zip.renameTo(new File(newName)));
    }


    /**
     * 遍历所有目录以及子目录的文件，移动到目录中。
     * 并删除所有子目录
     * @param filepath
     * @param outPath
     */
    public void dirHandle(String filepath, String outPath){
        //递归遍历目录以及子目录的文件
        final List<File> files = FileUtil.loopFiles(filepath);
        //移动文件到同一个目录
        File outFile = new File(outPath);
        for(File file : files){
            FileUtil.move(file, outFile, true);
        }
        //删除所有子目录
        Arrays.stream(FileUtil.ls(filepath)).filter(f -> {
            return f.isDirectory();
        }).forEach(FileUtil::del);
    }

    /**
     * 批量解压缩zip
     * @param zipFilePath zip路径
     * @param outFilePath 输入路径
     * @param charset 解压缩编码格式
     */
    public void unZip(String zipFilePath, String outFilePath, String charset){
        //1、过滤掉不是zip格式的文件
        final List<File> files = FileUtil.loopFiles(zipFilePath, (f) -> {
            String[] suffix = f.getName().split("\\.");
            return zipSet.contains(suffix[suffix.length - 1]);
        });
        //2、循环解压
        for (File file :
                files) {
            ZipUtil.unzip(file, new File(outFilePath), Charset.forName(charset));
        }
    }
}
